package com.cskaoyan.javase._1extends._7initialization._2notice;

/**
 * 注意事项：
 *      1.子类对象的隐式初始化依赖于父类的无参构造，一旦某个类没有无参构造器
 *          那么它的子类对象就不存在隐式初始化。
 *          所以我们在定义类时，顺手给类加上无参构造器是一个好习惯。
 *
 *
 *      2.我们发现子类对象初始化过程中，无论是隐式还是显式，都需要调用父类构造器
 *          虽然父类构造器被调用了，但是父类对象并没有创建
 *          构造器的作用不是创建对象，而是在创建对象过程中给成员变量赋值。
 *          构造器有两个作用：
 *              1.创建自身对象，给自身成员变量赋值。 自己用。
 *              2.创建子类对象时，给这个子类的父类成员变量赋值。 给子类用。
 *
 *     3.this和super在（子类构造器中）表示调用其它构造器时，都必须在构造器代码的第一行。
 *          所以一个构造器中最多只能有一个（也必须有一个）表示调用其它构造器的语句
 *          要么是this表示调用自身构造器
 *          要么是super表示调用父类构造器
 *          还有如果上述语句都没有写出来，那么就隐含super()，表示调用父类无参构造器。
 *
 *
 * @since 14:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class Father {
    int num;

    public Father(int num) {
        // super();
        // System.out.println();
        this();
        this.num = num;
    }

    public Father() {
        // super();
    }
}

// There is no default constructor available in 'com.cskaoyan.javase._1extends._7initialization._2notice.Father'
class Son extends Father {
    public Son() {
        // super();
    }

    public Son(int num) {
        // super();
        // System.out.println();
        super(num);
        System.out.println();
    }
}